home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / Interfaces&Libraries / Interfaces / CIncludes / mistream.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-14  |  15.4 KB  |  472 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        mistream.h
  3.  
  4.     Contains:    xxx put contents here xxx
  5.  
  6.     Change History (most recent first):
  7.  
  8.                  2/12/96    pfl        xxx put comment here xxx
  9.  
  10.     To Do:
  11.         • Fix up the pragma options.
  12.         §
  13. */
  14.  
  15. /** Copyright (c) 1989-1994  Mentat Inc.
  16.  ** stream.h 4.7, last change 10 Apr 1994
  17.  **/
  18.  
  19. #ifndef _MPS_STREAM_
  20. #define _MPS_STREAM_
  21.  
  22. #if PRAGMA_ALIGN_SUPPORTED
  23.     #if GENERATING68K
  24.     #pragma options align=mac68k
  25.     #endif
  26.     #if GENERATINGPOWERPC
  27.     #pragma options align=power
  28.     #endif
  29. #endif
  30.  
  31. #if OTKERNEL
  32.  
  33. /* defines module or driver */
  34. struct streamtab 
  35. {
  36.     struct qinit*    st_rdinit;        /* defines read QUEUE */
  37.     struct qinit*    st_wrinit;        /* defines write QUEUE */
  38.     struct qinit*    st_muxrinit;    /* for multiplexing drivers only */
  39.     struct qinit*    st_muxwinit;    /* ditto */
  40. };
  41.  
  42. typedef struct queue 
  43. {
  44.     struct qinit*    q_qinfo;    /* procedures and limits for queue */
  45.     struct msgb*     q_first;    /* head of message queue */
  46.     struct msgb*     q_last;        /* tail of message queue */
  47.     struct queue*    q_next;        /* next queue in Stream */
  48.     union 
  49.     {
  50.         struct queue*    q_u_link;     /* link to scheduling queue */
  51.         struct sqh_s*    q_u_sqh_parent;
  52.     } q_u;
  53.     char*            q_ptr;        /* to private data structure */
  54.     unsigned long    q_count;    /* weighted count of characters on q */
  55.     long            q_minpsz;    /* min packet size accepted */
  56.     long            q_maxpsz;    /* max packet size accepted */
  57.     unsigned long    q_hiwat;    /* high water mark, for flow control */
  58.     unsigned long    q_lowat;    /* low water mark */
  59.     struct qband*    q_bandp;    /* band information */
  60.     unsigned short    q_flag;     /* %%% queue state */
  61.     unsigned char    q_nband;    /* %%% number of bands */
  62.     unsigned char    q_pad1[1];    /* %%% reserved */
  63.     struct q_xtra*    q_osx;        /* Pointer to OS-dependent extra stuff */
  64.     struct queue*    q_ffcp;        /* Forward flow control pointer */
  65.     struct queue*    q_bfcp;        /* Backward flow control pointer */
  66. } queue_t;
  67.  
  68. #define q_link            q_u.q_u_link
  69. #define q_sqh_parent    q_u.q_u_sqh_parent
  70.  
  71. /* queue_t flag defines */
  72. #define QREADR                    0x1     /* This queue is a read queue */
  73. #define QNOENB                    0x2     /* Don't enable in putq */
  74. #define QFULL                    0x4     /* The queue is full */
  75. #define QWANTR                    0x8     /* The queue should be scheduled in the next putq */
  76. #define QWANTW                    0x10    /* The stream should be back enabled when this queue drains */
  77. #define QUSE                    0x20    /* The queue is allocated and ready for use */
  78. #define QENAB                    0x40    /* The queue is scheduled (on the run queue) */
  79. #define QBACK                    0x80    /* The queue has been back enabled */
  80. #define QOLD                    0x100    /* Module supports old style opens and closes */
  81. #define QHLIST                    0x200    /* The Stream head is doing something with this queue (Not supported by MPS) */
  82. #define QWELDED                 0x400    /* Mentat flag for welded queues */
  83. #define    QUNWELDING                0x800    /* Queue is scheduled to be unwelded */
  84. #define    QPROTECTED                0x1000    /* Mentat flag for unsafe q access */
  85.  
  86. typedef struct qband 
  87. {
  88.     struct qband*    qb_next;    /* next band for this queue */
  89.     unsigned long    qb_count;    /* weighted count of characters in this band */ 
  90.     struct msgb*     qb_first;     /* head of message queue */
  91.     struct msgb*     qb_last;    /* tail of message queue */
  92.     unsigned long    qb_hiwat;    /* high water mark */
  93.     unsigned long    qb_lowat;    /* low water mark */
  94.     unsigned short    qb_flag;    /* %%% state */
  95.     short            qb_pad1;    /* %%% reserved */
  96. } qband_t;
  97.  
  98. /* qband_t flag defines */
  99. #define QB_FULL         0x1             /* The band is full */
  100. #define QB_WANTW        0x2             /* The stream should be back enabled when this band/queue drains */
  101. #define QB_BACK         0x4             /* The queue has been back enabled */
  102.  
  103. typedef    int    (* _CDECL putp_t)(queue_t *, struct msgb *);
  104. typedef    int    (* _CDECL srvp_t)(queue_t *);
  105. typedef int (* _CDECL admin_t)(void);
  106. typedef void (* _CDECL bufcall_t)(long);
  107. typedef int    (* _CDECL openp_t)(queue_t*, dev_t*, int, int, cred_t*);
  108. typedef int (* _CDECL closep_t)(queue_t*, int, cred_t*);
  109. typedef int    (* _CDECL openOld_t)(queue_t*, dev_t, int, int);
  110. typedef int (* _CDECL closeOld_t)(queue_t*);
  111.  
  112. struct qinit 
  113. {
  114.     putp_t        qi_putp;                /* put procedure */
  115.     srvp_t        qi_srvp;                /* service procedure */
  116.     openp_t        qi_qopen;                /* called on each open or a push */
  117.     closep_t    qi_qclose;                 /* called on last close or a pop */
  118.     admin_t        qi_qadmin;                 /* reserved for future use */
  119.     struct module_info* qi_minfo;        /* information structure */
  120.     struct module_stat* qi_mstat;        /* statistics structure - optional */
  121. };
  122.  
  123. struct module_info 
  124. {
  125.     unsigned short    mi_idnum;        /* module ID number */
  126.     char*            mi_idname;        /* module name */
  127.     long            mi_minpsz;        /* min pkt size, for developer use */
  128.     long            mi_maxpsz;        /* max pkt size, for developer use */
  129.     unsigned long    mi_hiwat;        /* hi-water mark, for flow control */
  130.     unsigned long    mi_lowat;        /* lo-water mark, for flow control */
  131. };
  132.  
  133. #else
  134.  
  135. typedef int    queue_t;
  136.  
  137. #endif    /* OTKERNEL */
  138.  
  139. /* message block */
  140.  
  141. #if PRAGMA_ALIGN_SUPPORTED
  142. #pragma options align=reset
  143. #pragma options align=mac68k
  144. #endif
  145.  
  146. typedef struct msgb 
  147. {
  148.     struct msgb*     b_next;        /* next message on queue */
  149.     struct msgb*     b_prev;        /* previous message on queue */
  150.     struct msgb*     b_cont;        /* next message block of message */
  151.     unsigned char*    b_rptr;        /* first unread data byte in buffer */
  152.     unsigned char*    b_wptr;        /* first unwritten data byte */
  153.     struct datab*    b_datap;    /* data block */
  154.     unsigned char    b_band;     /* message priority */
  155.     unsigned char    b_pad1;
  156.     unsigned short    b_flag;
  157. #ifdef    MSGB_XTRA
  158.     MSGB_XTRA
  159. #endif
  160. } mblk_t;
  161.  
  162. #if GENERATINGPOWERPC
  163.     #pragma options align=reset
  164.     #pragma options align=power
  165. #endif
  166.  
  167. /* mblk flags */
  168. #define MSGMARK         0x01            /* last byte of message is tagged */
  169. #define MSGNOLOOP        0x02            /* don't pass message to write-side of stream */
  170. #define MSGDELIM        0x04            /* message is delimited */
  171. #define MSGNOGET        0x08
  172.  
  173. /* data descriptor */
  174.  
  175. typedef struct datab 
  176. {
  177.     union 
  178.     {
  179.         struct datab*    freep;
  180.         struct free_rtn* frtnp;
  181.     } db_f;
  182.     unsigned char*    db_base;        /* first byte of buffer */
  183.     unsigned char*    db_lim;            /* last byte+1 of buffer */
  184.     unsigned char    db_ref;         /* count of messages pointing to block*/
  185.     unsigned char    db_type;        /* message type */
  186.     unsigned char    db_iswhat;        /* message status */
  187.     unsigned char    db_filler2;        /* for spacing */
  188.     unsigned int    db_size;        /* used internally */
  189.     unsigned char*    db_msgaddr;     /* used internally */
  190.     long            db_filler;
  191. } dblk_t;
  192. #define db_freep        db_f.freep
  193. #define db_frtnp        db_f.frtnp
  194.  
  195. /* Free return structure for esballoc */
  196. typedef struct free_rtn 
  197. {
  198.     void    (* _CDECL free_func)(char* arg);     /* Routine to call to free buffer */
  199.     char*    free_arg;                             /* Parameter to free_func */
  200. } frtn_t;
  201.  
  202. /* Message types */
  203. #define QNORM            0
  204. #define M_DATA            0                /* Ordinary data */
  205. #define M_PROTO         1                /* Internal control info and data */
  206. #define M_BREAK         010             /* Request a driver to send a break */
  207. #define M_PASSFP        011             /* Used to pass a file pointer */
  208. #define M_SIG            013             /* Requests a signal to be sent */
  209. #define M_DELAY         014             /* Request a real-time delay */
  210. #define M_CTL            015             /* For inter-module communication */
  211. #define M_IOCTL         016             /* Used internally for I_STR requests */
  212. #define M_SETOPTS        020             /* Alters characteristics of Stream head */
  213. #define M_RSE            021             /* Reserved for internal use */
  214.  
  215. /* MPS private type */
  216. #define M_MI            0100
  217. #define M_MI_READ_RESET    1
  218. #define M_MI_READ_SEEK       2
  219. #define M_MI_READ_END       4
  220.  
  221. /* Priority messages types */
  222. #define QPCTL            0200
  223. #define M_IOCACK        0201            /* Positive ack of previous M_IOCTL */
  224. #define M_IOCNAK        0202            /* Previous M_IOCTL failed */
  225. #define M_PCPROTO        0203            /* Same as M_PROTO except for priority */
  226. #define M_PCSIG         0204            /* Priority signal */
  227. #define M_FLUSH         0206            /* Requests modules to flush queues */
  228. #define M_STOP            0207            /* Request drivers to stop output */
  229. #define M_START         0210            /* Request drivers to start output */
  230. #define M_HANGUP        0211            /* Driver can no longer produce data */
  231. #define M_ERROR         0212            /* Reports downstream error condition */
  232. #define M_READ            0213            /* Reports client read at Stream head */
  233. #define M_COPYIN        0214            /* Requests the Stream to copy data in for a module */
  234. #define M_COPYOUT        0215            /* Requests the Stream to copy data out for a module */
  235. #define M_IOCDATA        0216            /* Status from M_COPYIN/M_COPYOUT message */
  236. #define M_PCRSE         0220            /* Reserved for internal use */
  237. #define M_STOPI         0221            /* Request drivers to stop input */
  238. #define M_STARTI        0222            /* Request drivers to start input */
  239. #define M_HPDATA        0223            /* MPS-private type; high priority data */
  240.  
  241. /* Defines for flush messages */
  242. #define FLUSHALL        1
  243. #define FLUSHDATA        0
  244.  
  245. #define NOERROR         -1                /* used in M_ERROR messages */
  246.  
  247. /* structure contained in M_COPYIN/M_COPYOUT messages */
  248. struct copyreq 
  249. {
  250.     int             cq_cmd;         /* ioctl command (from ioc_cmd) */
  251.     struct cred*    cq_cr;            /* pointer to full credentials */
  252.     unsigned int    cq_id;            /* ioctl id (from ioc_id) */
  253.     unsigned char*    cq_addr;        /* address to copy data to/from */
  254.     unsigned int    cq_size;        /* number of bytes to copy */
  255.     int             cq_flag;        /* state */
  256.     mblk_t*            cq_private;        /* private state information */
  257.     long            cq_filler[4];
  258. };
  259. #define cq_uid    cq_cr->cr_uid
  260. #define cq_gid    cq_cr->cr_gid
  261.  
  262. /* copyreq defines */
  263. #define STRCANON        0x1             /* b_cont data block contains canonical format specifier */
  264. #define RECOPY            0x2             /* perform I_STR copyin again this time using canonical format specifier */
  265.  
  266. /* structure contained in M_IOCDATA message block */
  267. struct copyresp 
  268. {
  269.     int             cp_cmd;         /* ioctl command (from ioc_cmd) */
  270.     struct cred*    cp_cr;            /* pointer to full credentials */
  271.     unsigned int    cp_id;            /* ioctl id (from ioc_id) */
  272.     unsigned char*    cp_rval;        /* status of request; 0 for success; error value for failure */
  273.     unsigned int    cp_pad1;
  274.     int             cp_pad2;
  275.     mblk_t*            cp_private;        /* private state information */
  276.     long            cp_filler[4];
  277. };
  278. #define cp_uid    cp_cr->cr_uid
  279. #define cp_gid    cp_cr->cr_gid
  280.  
  281. /* structure contained in an M_IOCTL message block */
  282. struct iocblk 
  283. {
  284.     int             ioc_cmd;        /* ioctl command type */
  285.     struct cred*    ioc_cr;            /* pointer to full credentials */
  286.     unsigned int    ioc_id;         /* ioctl id */
  287.     unsigned int    ioc_count;        /* count of bytes in data field */
  288.     int             ioc_error;        /* error code */
  289.     int             ioc_rval;        /* return value */
  290.     long            ioc_filler[4];
  291. };
  292. #define ioc_uid ioc_cr->cr_uid
  293. #define ioc_gid ioc_cr->cr_gid
  294.  
  295. #define TRANSPARENT             ((unsigned int)-1)        /* ioc_count value for transparent ioctl's */
  296.  
  297. /* Used in M_IOCTL mblks to muxes (ioc_cmd I_LINK) */
  298. struct linkblk 
  299. {
  300.     struct queue* l_qtop;        /* lowest level write queue of upper stream */
  301.     struct queue* l_qbot;        /* highest level write queue of lower stream */
  302.     int     l_index;        /* system-unique index for lower stream */
  303.     long        l_pad[5];
  304. };
  305.  
  306. /* structure contained in an M_PASSFP message block */
  307. struct strpfp 
  308. {
  309.     unsigned long    pass_file_cookie;        /* file 'pointer' */
  310.     unsigned short    pass_uid;                /* user id of sending stream */
  311.     unsigned short    pass_gid;
  312.     struct sth_s*    pass_sth;             /* Stream head pointer of passed stream */
  313. };
  314.  
  315. /* structure contained in an M_SETOPTS message block */
  316. struct stroptions 
  317. {
  318.     unsigned long so_flags; /* options to set */
  319.     short            so_readopt;     /* read option */
  320.     unsigned short    so_wroff;        /* write offset */
  321.     long            so_minpsz;        /* minimum read packet size */
  322.     long            so_maxpsz;        /* maximum read packet size */
  323.     unsigned long    so_hiwat;        /* read queue high-water mark */
  324.     unsigned long    so_lowat;        /* read queue low-water mark */
  325.     unsigned char    so_band; /* band for water marks */
  326.     unsigned long    so_poll_set;    /* poll events to set */
  327.     unsigned long    so_poll_clr;    /* poll events to clear */
  328. };
  329. /* definitions for so_flags field */
  330. #define SO_ALL            0x7fff    /* Update all options */
  331. #define SO_READOPT        0x0001    /* Set the read mode */
  332. #define SO_WROFF        0x0002    /* Insert an offset in write M_DATA mblks */
  333. #define SO_MINPSZ        0x0004    /* Change the min packet size on sth rq */
  334. #define SO_MAXPSZ        0x0008    /* Change the max packet size on sth rq */
  335. #define SO_HIWAT        0x0010    /* Change the high water mark on sth rq */
  336. #define SO_LOWAT        0x0020    /* Change the low water mark */
  337. #define SO_MREADON        0x0040    /* Request M_READ messages */
  338. #define SO_MREADOFF     0x0080    /* Don't gen M_READ messages */
  339. #define SO_NDELON        0x0100    /* old TTY semantics for O_NDELAY reads and writes */
  340. #define SO_NDELOFF        0x0200    /* STREAMS semantics for O_NDELAY reads and writes */
  341. #define SO_ISTTY        0x0400    /* Become a controlling tty */
  342. #define SO_ISNTTY        0x0800    /* No longer a controlling tty */
  343. #define SO_TOSTOP        0x1000    /* Stop on background writes */
  344. #define SO_TONSTOP        0x2000    /* Don't stop on background writes */
  345. #define SO_BAND         0x4000    /* Water marks are for a band */
  346. #define SO_POLL_SET        0x8000    /* Set events to poll */
  347. #define SO_POLL_CLR        0x10000    /* Clear events to poll */
  348.  
  349. /* Buffer Allocation Priority */
  350. #define BPRI_LO         1
  351. #define BPRI_MED        2
  352. #define BPRI_HI         3
  353.  
  354. #ifndef INFPSZ
  355. #define INFPSZ            -1
  356. #endif
  357.  
  358. /** Test whether message is a data message */
  359. #define datamsg(type)    ((type) == M_DATA || (type) == M_PROTO || (type) == M_PCPROTO  ||  (type) == M_DELAY)
  360.  
  361. #if OTKERNEL
  362.  
  363. /** Re-allow a queue to be scheduled for service */
  364. #define enableok(q)     ((q)->q_flag &= ~QNOENB)
  365.  
  366. /** Prevent a queue from being scheduled */
  367. #define noenable(q)     ((q)->q_flag |= QNOENB)
  368.  
  369. /** Get pointer to the mate queue */
  370. #define OTHERQ(q)        (((q)->q_flag & QREADR) ? WR(q) : RD(q))
  371.  
  372. /** Get pointer to the read queue, assumes 'q' is a write queue ptr */
  373. #define RD(q)    (&q[-1])
  374.  
  375. /** Get pointer to the write queue, assumes 'q' is a read queue ptr */
  376. #define WR(q)    (&q[1])
  377.  
  378. #endif    /* OTKERNEL */
  379.  
  380. #define CLONEOPEN        0x2
  381. #define MODOPEN         0x1
  382. #define OPENFAIL        -1
  383.  
  384. /* Enumeration values for strqget and strqset */
  385. typedef enum qfields {
  386.     QHIWAT    = 0,
  387.     QLOWAT    = 1,
  388.     QMAXPSZ    = 2,
  389.     QMINPSZ    = 3,
  390.     QCOUNT    = 4,
  391.     QFIRST    = 5,
  392.     QLAST    = 6,
  393.     QFLAG    = 7,
  394.     QBAD    = 8
  395. } qfields_t;
  396.  
  397. #ifdef __cplusplus
  398. extern "C" {
  399. #endif
  400.  
  401. #if OTKERNEL
  402.  
  403. mblk_t*        allocb(size_t size, int pri);
  404. queue_t*    allocq(void);
  405. int            adjmsg(mblk_t*, int len_param);
  406. queue_t*    backq(queue_t*);
  407.  
  408. int        bcanput(queue_t*, uchar_p pri);
  409. int        bcanputnext(queue_t*, uchar_p pri);
  410. int        bufcall(size_t memNeeded, int pri, bufcall_t,    // %%%
  411.                 long context);
  412. int        canput(queue_t*);
  413. int        canputnext(queue_t*);
  414. mblk_t*    copyb(mblk_t*);
  415. mblk_t*    copymsg(mblk_t*);
  416. mblk_t*    dupb(mblk_t*);
  417. mblk_t*    dupmsg(mblk_t*);
  418. mblk_t*    esballoc(unsigned char* base, size_t size, int pri, frtn_t*);
  419. void    flushband(queue_t*, uchar_p pri, int flag);
  420. void    flushq(queue_t*, int flag);
  421. void    freeb(mblk_t*);
  422. void    freemsg(mblk_t*);
  423. int        freeq(queue_t*);
  424. int        freezestr(queue_t*);
  425. admin_t    getadmin(ushort_p mid);
  426. unsigned short    getmid(char * name);
  427. mblk_t*    getq(queue_t*);
  428. int        insq(queue_t*, mblk_t* emp, mblk_t* nmp);
  429. void    linkb(mblk_t* mp1, mblk_t* mp2);
  430. int        msgdsize(const mblk_t*);
  431. mblk_t*    msgpullup(mblk_t*, int len);
  432. int        pullupmsg(mblk_t*, int len);
  433. int        putbq(queue_t*, mblk_t*);
  434. int        putctl(queue_t*, int type);
  435. int        putnextctl(queue_t*, int type);
  436. int        putctl1(queue_t*, int type, int c);
  437. int        putnextctl1(queue_t*, int type, int c);
  438. int        putctl2(queue_t*, int type, int c1, int c2);
  439. #ifndef puthere
  440. int        puthere(queue_t*, mblk_t*);
  441. #endif
  442. int        putnext(queue_t*,  mblk_t*);
  443. int        putq(queue_t*, mblk_t*);
  444. int        putq_owned(queue_t*, mblk_t*);                                    // this line deleted for release disk
  445. void    qenable(queue_t*);
  446. void    qprocson(queue_t*);
  447. void    qprocsoff(queue_t*);
  448. int        qreply(queue_t*, mblk_t*);
  449. int        qsize(queue_t*);
  450. mblk_t*    rmvb(mblk_t * mp, mblk_t * bp);
  451. void    rmvq(queue_t*, mblk_t*);
  452. /* prototype for strlog in strlog.h */
  453. int        strqget(queue_t*, qfields_t what, uchar_p pri, long* valp);
  454. int        strqset(queue_t*, qfields_t what, uchar_p pri, long val);
  455. int        testb(int size, int pri);
  456. void    unbufcall(int id);
  457. void    unfreezestr(queue_t * q, int oldpri);
  458. mblk_t*    unlinkb(mblk_t*);
  459.  
  460. #endif    /* OTKERNEL */
  461.  
  462. #ifdef __cplusplus
  463. }
  464. #endif
  465.  
  466. #if PRAGMA_ALIGN_SUPPORTED
  467. #pragma options align=reset
  468. #endif
  469.  
  470.  
  471. #endif    /* ifdef _MPS_STREAM_    */
  472.